/*
 * ClienteParticular.java
 *
 * Created on 15 de Maio de 2007, 22:40
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pt.iscte.dcti.es.rhplus.utilizador;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.LinkedList;

import pt.iscte.dcti.es.rhplus.sistema.CodigoPostal;
import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public class ClienteParticular extends Cliente {

	/** Creates a new instance of ClienteParticular */
	public ClienteParticular(final int id_pessoa, final String nome, final char sexo, final int bi, final Date data_de_nascimento, final int nif,
			final String email, final int telefone, final int telemovel, final String morada, final String grupo_sanguineo,
			final CodigoPostal codigo_postal, final LinkedList<TratamentoPassado> lista_de_tratamentos_passados,
			LinkedList<DoencaPassada> lista_de_doencas_passadas, final int numero_de_cliente, final LinkedList<MembroDoAgregado> membros_do_agregado) {

		super(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel, morada, grupo_sanguineo, codigo_postal,
				lista_de_tratamentos_passados, lista_de_doencas_passadas, numero_de_cliente, membros_do_agregado);

		this.tipo = "particular";
	}

	public static ClienteParticular devolve(final String username) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("visualizar_cliente_particular_por_username");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_username", username);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_pessoa);

		result_set.next();

		int id_codigo_postal = result_set.getInt("id_codigo_postal");

		// Cria o Membro do Agregado e os outros elementos necessarios
		int id_pessoa = result_set.getInt("id_pessoa");
		String nome = result_set.getString("nome");
		char sexo = result_set.getString("sexo").charAt(0);
		int bi = result_set.getInt("bi");
		Date data_de_nascimento = result_set.getDate("data_de_nascimento");
		int nif = result_set.getInt("nif");
		String email = result_set.getString("email");
		int telefone = result_set.getInt("telefone");
		int telemovel = result_set.getInt("telemovel");
		String morada = result_set.getString("morada");
		String grupo_sanguineo = result_set.getString("grupo_sanguineo");
		int numero_de_cliente = result_set.getInt("numero_de_cliente");

		acesso_bd.fechaLigacao();

		CodigoPostal codigo_postal = CodigoPostal.devolve(id_codigo_postal);
		LinkedList<TratamentoPassado> lista_de_tratamentos_passados = TratamentoPassado.devolveTodosDoUtente(id_pessoa);
		LinkedList<DoencaPassada> lista_de_doencas_passadas = DoencaPassada.devolveTodasDoUtente(id_pessoa);
		LinkedList<MembroDoAgregado> membros_do_agregado = MembroDoAgregado.devolveTodosDoCliente(id_pessoa);

		ClienteParticular cliente_particular = new ClienteParticular(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel,
				morada, grupo_sanguineo, codigo_postal, lista_de_tratamentos_passados, lista_de_doencas_passadas, numero_de_cliente,
				membros_do_agregado);

		return cliente_particular;
	}

	public static ClienteParticular devolve(final int id_cliente) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("visualizar_cliente_particular_por_id");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_id_cliente", id_cliente);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_pessoa);

		result_set.next();

		int id_codigo_postal = result_set.getInt("id_codigo_postal");

		// Cria o Membro do Agregado e os outros elementos necessarios
		String nome = result_set.getString("nome");
		char sexo = result_set.getString("sexo").charAt(0);
		int bi = result_set.getInt("bi");
		Date data_de_nascimento = result_set.getDate("data_de_nascimento");
		int nif = result_set.getInt("nif");
		String email = result_set.getString("email");
		int telefone = result_set.getInt("telefone");
		int telemovel = result_set.getInt("telemovel");
		String morada = result_set.getString("morada");
		String grupo_sanguineo = result_set.getString("grupo_sanguineo");
		int numero_de_cliente = result_set.getInt("numero_de_cliente");

		acesso_bd.fechaLigacao();

		CodigoPostal codigo_postal = CodigoPostal.devolve(id_codigo_postal);
		LinkedList<TratamentoPassado> lista_de_tratamentos_passados = TratamentoPassado.devolveTodosDoUtente(id_cliente);
		LinkedList<DoencaPassada> lista_de_doencas_passadas = DoencaPassada.devolveTodasDoUtente(id_cliente);
		LinkedList<MembroDoAgregado> membros_do_agregado = MembroDoAgregado.devolveTodosDoCliente(id_cliente);

		ClienteParticular cliente_particular = new ClienteParticular(id_cliente, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel,
				morada, grupo_sanguineo, codigo_postal, lista_de_tratamentos_passados, lista_de_doencas_passadas, numero_de_cliente,
				membros_do_agregado);

		return cliente_particular;
	}

	public static void insere(final Hashtable<String, Object> dados_cliente_particular) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		Cliente.insereParticular(dados_cliente_particular);
	}


   public static LinkedList<String> verificaMensagens(final int id_pessoa) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
System.out.println("id no verficaMensagens: "+id_pessoa);
        LinkedList<String> lista_mensagens = new LinkedList<String>();

        AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("verifica_mesagens");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_id_pessoa", id_pessoa);

		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_pessoa);


        while(result_set.next()){
            
            String link_para_remover = "<a href=\"Gestor?gestor=gestor_de_utentes&accao=remover_mensagem&id_mensagem=" + result_set.getInt("id_mensagem") + "\">[Remover]</a>";
            lista_mensagens.add(result_set.getString("texto") + link_para_remover);
        }

        acesso_bd.fechaLigacao();
        return lista_mensagens;
	}

    //Helio25{
    public static LinkedList<String> verificaMensagensAgegados(final int id_pessoa)
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
         LinkedList<String> lista_mensagens = new LinkedList<String>();

         LinkedList<MembroDoAgregado> lista_membros = MembroDoAgregado.devolveTodosDoCliente(id_pessoa);

         for( MembroDoAgregado m_a : lista_membros ) {
             LinkedList<String> lista_mensagens_agregado = verificaMensagens(m_a.getIdPessoa());
             if( !lista_mensagens_agregado.isEmpty()) {
                 lista_mensagens.add("<b><i>[Membro do agregado: " + m_a.getNome() + "]</i></b>");
                 for( String msg : lista_mensagens_agregado )
                     lista_mensagens.add(msg);
             }
         }

         return lista_mensagens;
	}
    //}Helio25

	public String getTipo() {
		return "particular";
	}
}
